package cn.kk.redis;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class JedisDemo {
	@Test
	public void jedisConnection() {
		//创建jedis的对象,在构造方法中传递ip和端口port
		Jedis jedis = new Jedis("192.168.64.128", 6379);
		//调用jedis的set,get,expire等方法执行redis中的某些特定命令
		/*jedis.auth("123456");*/
		for (int i = 0; i < 50; i++) {
			jedis.set("data" + i, i + "");
		}
		jedis.close();
	}
	@Test
	public void testCache(){
		System.out.println("用户开始查询数据");//controller接收到itemId参数
		String itemId = "17363738";
		//要根据id自动以一个key
		String key = "ITEM_" + itemId;//"ITEM_17363738"
		//连接redis,判断这个key值是否存在
		Jedis jedis = new Jedis("192.168.64.128", 6379);
		Boolean exists = jedis.exists(key);
		if(exists){//说明redis存在key-value
			//无需访问数据库,直接从redis获取
			String itemJson = jedis.get(key);
			System.out.println("获取到数据" + itemJson);
		}else {//说明redis不存在缓存数据
			System.out.println("redis无数据到数据库查询");
			String itemJson = "{'id':'17363738'}";
			//将查询结构存放到redis中
			jedis.set(key, itemJson);
			System.out.println("将数据:" + itemJson + "存放到redis");
		}
		jedis.close();
	}
	
	
	//hash取余数据分片计算
	@Test
	public void hashShared() {
		Jedis jedis6379 = new Jedis("192.168.64.128",6379);
		Jedis jedis6380 = new Jedis("192.168.64.128",6380);
		Jedis jedis6381 = new Jedis("192.168.64.128",6381);
		for(int i = 0; i < 1000; i++){
			String key = "testdata" + i;
			String value = "data" + i;
			int num = (key.hashCode()&Integer.MAX_VALUE)%3;
			if(num == 0){
				jedis6379.set(key, value);
			}else if (num == 1) {
				jedis6380.set(key, value);
			}else {
				jedis6381.set(key, value);
			}
		}
		jedis6379.close();
		jedis6380.close();
		jedis6381.close();
	}
	
	/*
	 * jedis本身也具有底层的分片计算逻辑;hash一致性;
	 * jedishash一致性分片,分片对象
	 */
	@Test
	public void jedisHashShared() {
		//分片对象底层实现了分片的逻辑,只需要收集所有
		//的连接信息,自动完成分片计算,调用方法和jedis一模一样
		//收集redis节点信息
		List<JedisShardInfo> infolist = new ArrayList<JedisShardInfo>();
		JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.64.128", 6379);
		JedisShardInfo jedisShardInfo2 = new JedisShardInfo("192.168.64.128", 6380);
		JedisShardInfo jedisShardInfo3 = new JedisShardInfo("192.168.64.128", 6381);
		infolist.add(jedisShardInfo1);
		infolist.add(jedisShardInfo2);
		infolist.add(jedisShardInfo3);
		//利用list对象,构造一个分片连接对象
		ShardedJedis shardedJedis = new ShardedJedis(infolist);
		shardedJedis.set("list", "OK,that's all!");
		System.out.println(shardedJedis.get("list"));
		shardedJedis.close();

	}
	/*
	 * jedis的分片连接池
	 * jedis提供性能更高的分片连接池对象,将jedis逻辑引入框架,
	 * 由框架来维护连接池对象;可以使用伪service封装框架维护的连接池对象.
	 */
	@Test
	public void jedisPool(){
		//利用节点信息,配置对象:最大连接数,最小连接数,最大空闲数,
		//连接超时,connetTime,sockeyTime,重连次数;
		//收集信息
		List<JedisShardInfo> infolist = new ArrayList<JedisShardInfo>();
		JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.64.128", 6379);
		JedisShardInfo jedisShardInfo2 = new JedisShardInfo("192.168.64.128", 6380);
		JedisShardInfo jedisShardInfo3 = new JedisShardInfo("192.168.64.128", 6381);
		infolist.add(jedisShardInfo1);
		infolist.add(jedisShardInfo2);
		infolist.add(jedisShardInfo3);
		//构造一个具有配置条件的配置对象
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(8);//最大空闲连接空闲
		config.setMaxTotal(200);
		//利用配置对象,和连接信息构造连接池对象
		ShardedJedisPool jedisPool = new ShardedJedisPool(config, infolist);
		//从pool获取分片对象操作集群
		jedisPool.getResource();
		jedisPool.close();
	}
	/*
	 * springboot整合jedis
	 * 在框架中整合分片连接池,更好的完成缓存任务,体现其性能;
	 */
	

}
